La Capacidad de Computación (CC) actúa como el puente de versión entre arquitectura virtual (PTX) y arquitectura real (SASS/Binario). Los desarrolladores usan nvcc para dirigirse a plataformas específicas, que van desde plataformas de escritorio/servidor hasta plataformas embebidas, en modelos de sistema operativo como Linux de 64 bits (LP64) o Windows de 64 bits (LLP64).
1. Arquitecturas Virtuales frente a Reales
La herramienta CUDA soporta arquitecturas de GPU de las dos últimas versiones principales, referenciadas en Tabla 29: Soporte de Funcionalidades según Capacidad de Computación (7.5 a 12.x). Definimos mapeos usando banderas como: nvcc --generate-code arch=compute_80,code=sm_90 prog.cu. Para objetivos futuros, se usan banderas como nvcc -arch=sm_100 o variantes especializadas como nvcc -arch=sm_100a se utilizan.
2. Jerarquía de Macros
El compilador usa __CUDA_ARCH__ para ramificar el código. La macro __CUDA_ARCH__ solo está definida en código de dispositivo (por ejemplo, __device__, __global__). Se proporciona un control más granular mediante __CUDA_ARCH_SPECIFIC__ y __CUDA_ARCH_FAMILY_SPECIFIC__. Algunas funciones, como Memoria Compartida Distribuida o cargas específicas valores NaN, requieren Capacidad de Computación 9.0+ o Capacidad de Computación 10.0 y posteriores.
3. Límites y Restricciones Numéricos
La precisión varía según la CC; por ejemplo, el manejo de valores subnormales asegura que $2^{-16382} \approx 3.36 \cdot 10^{-4932}$. Límites de hardware como CUDA_DEVICE_MAX_COPY_CONNECTIONS=16 o la directiva .maxnreg de PTX se aplican estrictamente según la versión de CC objetivo.